package com.lqk.state.app;

/**
 * 状态模式测试类
 * @author Administrator
 *
 * 基本介绍
 *  1) 状态模式（State Pattern）：它主要用来解决对象在多种状态转换时，需要对外
 *  输出不同的行为的问题。状态和行为是一一对应的，状态之间可以相互转换
 *  2) 当一个对象的内在状态改变时，允许改变其行为，这个对象看起来像是改变了
 *  其类
 *
 * 状态模式的注意事项和细节
 *  1) 代码有很强的可读性。状态模式将每个状态的行为封装到对应的一个类中
 *  2) 方便维护。将容易产生问题的if-else语句删除了，如果把每个状态的行为都放到一
 *  个类中，每次调用方法时都要判断当前是什么状态，不但会产出很多if-else语句，
 *  而且容易出错
 *  3) 符合“开闭原则”。容易增删状态
 *  4) 会产生很多类。每个状态都要一个对应的类，当状态过多时会产生很多类，加大维
 *  护难度
 *  5) 应用场景：当一个事件或者对象有很多种状态，状态之间会相互转换，对不同的状
 *  态要求有不同的行为的时候，可以考虑使用状态模式
 *
 */
public class ClientTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 创建活动对象，奖品池有1个奖品
        RaffleActivity activity = new RaffleActivity(1);

        // 我们连续抽三次奖
        for (int i = 0; i < 3; i++) {
            System.out.println("--------第" + (i + 1) + "次抽奖----------");
            // 参加抽奖，第一步点击扣除积分
            activity.deductMoney();

            // 第二步抽奖
            activity.raffle();
        }
    }

}

